package com.vvv.designpattern.structuredpattern;

import javax.security.auth.Subject;

/**
 * @author vvv
 * @date 2023-11-13 18 25
 * discription 静态代理
 */
public class StaticProxy {
    public static void main(String[] args) {
        /**
         * 静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类
         */
        Subject1 realSubject1 = new RealSubject1();
        Proxy1 proxy1 = new Proxy1(realSubject1);
        proxy1.doSomething();
        /**
         * 问题：
         * 因为代理对象和被代理对象(即目标对象)要一一对应，所以会有很多代理类
         * 一旦接口增加方法,目标对象与代理对象都要维护
         */
    }
}

/**
 * 接口
 */
interface Subject1 {
    void doSomething();
}

/**
 * 被代理对象(即目标对象)
 */
class RealSubject1 implements Subject1 {
    @Override
    public void doSomething() {
        System.out.println("RealSubject is doing something...");
    }
}

/**
 * 代理
 */
class Proxy1 implements Subject1 {

    // 目标
    private Subject1 subject1;

    public Proxy1(Subject1 subject1) {
        this.subject1 = subject1;
    }

    @Override
    public void doSomething() {
        System.out.println("log start =========================");
        subject1.doSomething();
        System.out.println("long end  =========================");
    }
}


